Tuli mieleen yksi juttu, jonka halusin lautapelitilastoistani laskea. Koska halusin vain kokeilla ja pohtia, onko kyseessä kiinnostava asia, en halunnut koodata ominaisuutta tilastosoftaani. Siksi homma kannatti tehdä taulukkolaskennassa.
Kun olen aikaisemmin käpistellyt pelitilastojani taulukkolaskennassa, olen kopioinut datan selaimesta ja liittänyt taulukkolaskentaan. Se on kuitenkin aika vaivalloista ja virheille herkkää. Asiaan on oltava parempi tapa.
Ajattelin, että voisin kirjoittaa tilastosoftaani tavan ottaa datan ulos pilkulla erotettuna datana. Mutta muitakin tapoja on. Tilastosoftani backend tuottaa JSON-dataa, joten voisiko sitä käyttää? Ainakaan Numbers ei kuitenkaan osaa lukea JSON:ia.
Se nörtimpi tapa tehdä
Työkaluja kuitenkin löytyy. Netissä on monia työkaluja JSON:sta CSV-muotoon konvertoimiseen, mutta tosihakkeri tekee omalla tavallaan. Komentorivityökalu jq vaikuttaisi näppärältä, joten asennellaanpa se:
brew install jq
Koska jq on tyylipuhdas Unix-työkalu, se lukee mieluusti syötettä putkesta. Nettisivulta putkeen haetaan vaikkapa curlilla:
curl 'https://gamestats.mikko.website/api/games/' | jq '.'
Testi toimii: jq tuuttaa JSONia pihalle niinkuin pitää. Datan lataaminen vie kuitenkin sen neljä sekuntia ja rasittaa turhaan serveriä joka kerta, joten ladataan mieluummin kerran ja käytetään ladattua tiedostoa:
cat games.json | jq '.'
(Ja kuten aikaisemmin kerroin, cat onkin itse asiassa bat, ei sillä että sillä tässä kohtaa olisi väliä.) Nyt voidaan vaikka rajata tiedostoa haluttuihin kenttiin:
cat games.json | jq '.[] | [.name, .plays, .stayingPower]'
Olennaisia ovat kulmasulkeet: ensimmäiset tarvitaan, jotta voidaan käsitellä kenttien nimiä ja jälkimmäiset siksi, että lopputuloksesta saadaan objektin sijasta array, koska vain arrayn voi muuttaa CSV:ksi.
Valmista tuli!
Nyt vain pusketaan tuotos CSV-suodattimen läpi, napataan tiedostoon ja avataan Numbersissa:
cat games.json | jq -r '.[] | [.name, .plays, .stayingPower] | @csv' > games.csv && open games.csv
-r-asetus tarvitaan vielä, jotta Numbers ymmärtää aineistoa oikein, muuten Numbers ei oikein sulata lainausmerkkeihin käärittyjä kenttiä. Ja kas:
Vielä hieman säätöä eli lisätään otsikot, muutetaan otsikoksi tulkittu sisältörivi sisältöriviksi ja kerrotaan Numbersille että desimaalierottimena on piste, ja jo toimii.
Pientä jatkokehittelyä
Desimaalierottimethan voi vaihtaa jo komentorivillä putkittamalla syötteen tr '.' ','
-komennon läpi, ja sed-komentoa voi käyttää lisäämään otsikot tiedoston alkuun.
Lopulta tästä kaikesta voi kehitellä aliaksen, jolla saa yhdellä komennolla pelitietokannan keskeiset tiedot avattua suoraan Numbersiin:
alias games2numbers='curl '\''https://gamestats.mikko.website/api/games/'\'' | jq -r '\''.[] | [.name, .plays, .wins, .year, .rating, .gameLength, .happiness, .hotness, .monthMetric, .yearMetric, .firstYear, .lastYear, .stayingPower] | @csv'\'' | tr '\''.'\'' '\'','\'' | sed '\''1 i\
Name, Plays, Wins, Year, Rating, Length, HHM, Hotness, MM, YM, First year, Last year, SP
'\'' > games.csv && open games.csv'
(Idea pelattujen pelien ja Staying Power -mittarin välisestä suhteesta osoittautui toimimattomaksi, eli hyvä että en lähtenyt koodaamaan. Tulos ei nostanut esiin niitä pelejä, joita ajattelin sen mahdollisesti nostavan, vaan pieni Staying Power -arvo on liian hallitseva, joten listan kärkeen nousi vain pelejä, joita olen pelannut kauan sitten, kun olisin halunnut hakea pelejä, joita oli pelattu paljon, mutta vain yhtenä tai kahtena vuonna. Hyvä että testasin näin!)